import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// 客户管理界面的类
public class ManageCustomerFrame extends JFrame {
    private JTable contactsTable;  // 表格
    private JTextField searchField;  // 搜索框

    // 构造方法，设置界面基本属性
    public ManageCustomerFrame() {
        setTitle("客户管理");  // 设置界面标题
        setSize(800, 600);  // 设置界面大小
        setLocationRelativeTo(null);  // 将界面居中显示
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置关闭操作,结束窗口程序

        JPanel panel = new JPanel(new BorderLayout());  // 创建面板，使用边界布局
        add(panel);  // 将面板添加到界面

        // 创建一个空的表格模型
        DefaultTableModel tableModel = new DefaultTableModel(
                new Object[][]{},
                new Object[]{"客户ID", "用户名", "用户级别", "用户注册时间", "客户累计消费总金额", "用户手机号", "用户邮箱"}//列名
        );

        // 创建表格
        contactsTable = new JTable(tableModel);
        JScrollPane scrollPane = new JScrollPane(contactsTable);//把表格添加到滚动窗格里面
        panel.add(scrollPane, BorderLayout.CENTER);

        // 添加用于增查操作和搜索的组件
        JButton deleteButton = new JButton("删除");  // 创建“删除”按钮
        JButton searchButton = new JButton("搜索");  // 创建“搜索”按钮
        JButton backButton = new JButton("返回管理员菜单界面");  // 创建登出按钮


        JPanel buttonPanel = new JPanel();  // 创建按钮面板，使用默认的FlowLayout布局

        buttonPanel.add(deleteButton);       //添加删除按钮
        searchField = new JTextField(20);  // 创建搜索框
        buttonPanel.add(searchField);
        buttonPanel.add(searchButton);      //添加搜索按钮
        buttonPanel.add(backButton);//添加返回按钮

        panel.add(buttonPanel, BorderLayout.SOUTH);

        // 添加“删除”按钮的监听器
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                deleteCustomers();  // 执行删除联系人操作
            }
        });

        // 添加“搜索”按钮的监听器
        searchButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                searchCustomers(searchField.getText());  // 执行搜索联系人操作
            }
        });
        //添加"返回"按钮的监听器
        backButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
                AdminMenuFrame adminMenuFrame =new AdminMenuFrame();
                adminMenuFrame.setVisible(true);
            }
        });
        // 初始化表格内容

        refreshTable();  // 刷新表格显示
    }


    // 删除客户信息的方法，删除客户信息之前要给出警告提示，请用户确认是否继续删除操作
    private void deleteCustomers() {
        int selectedRow = contactsTable.getSelectedRow();  // 获取选中行的索引
        if (selectedRow != -1) {
            int customerId = (Integer) contactsTable.getValueAt(selectedRow, 0);  // 假设ID在第0列

            // 弹出确认对话框
            int confirm = JOptionPane.showConfirmDialog(this, "确定要删除选中的客户吗？", "确认删除", JOptionPane.YES_NO_OPTION);
            if (confirm == JOptionPane.YES_OPTION) {
                Connection connection = null;
                PreparedStatement ps = null;
                try {
                    connection = DBUtil.getConnection();  // 获取数据库连接
                    String sql = "DELETE FROM customers WHERE id = ?";  // 构建删除客户信息的SQL语句
                    ps = connection.prepareStatement(sql);
                    ps.setInt(1, customerId);  // 设置参数为选中联系人的ID

                    int result = ps.executeUpdate();  // 执行删除操作
                    if (result > 0) {
                        JOptionPane.showMessageDialog(this, "客户删除成功！");
                        refreshTable();  // 刷新表格显示
                    } else {
                        JOptionPane.showMessageDialog(this, "客户删除失败！");
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                    JOptionPane.showMessageDialog(this, "数据库操作失败！");
                } finally {
                    try {
                        if (ps != null) ps.close();
                        if (connection != null) connection.close();  // 关闭数据库连接
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        } else {
            JOptionPane.showMessageDialog(this, "请先选中要删除的客户！");
        }
    }

    // 根据关键字查询客户信息的方法,可以根据客户的用户名进行查询，也可以一次查询所有客户的信息
    private void searchCustomers(String keyword) {
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            connection = DBUtil.getConnection();  // 获取数据库连接

            // 构建根据关键字搜索联系人的SQL语句
            String sql = "SELECT * FROM customers WHERE id LIKE ? OR username LIKE ? OR level LIKE ? OR registertime LIKE ? OR spentmoney LIKE ? OR phone LIKE ? OR email LIKE ?";
            ps = connection.prepareStatement(sql);

            // 设置查询参数，使用通配符进行模糊匹配
            String searchPattern = "%" + keyword + "%";  // 创建查询模式
            ps.setString(1, searchPattern);  // 设置ID的搜索参数
            ps.setString(2, searchPattern);  // 设置用户名的搜索参数
            ps.setString(3, searchPattern);  // 设置等级的搜索参数
            ps.setString(4, searchPattern);  // 设置注册时间的搜索参数
            ps.setString(5, searchPattern);  // 设置消费金额的搜索参数
            ps.setString(6, searchPattern);  // 设置电话的搜索参数
            ps.setString(7, searchPattern);  // 设置邮箱的搜索参数

            rs = ps.executeQuery();  // 执行查询

            DefaultTableModel model = (DefaultTableModel) contactsTable.getModel();
            model.setRowCount(0);  // 清空当前表格数据

            while (rs.next()) {
                model.addRow(new Object[]{
                        rs.getInt("id"),
                        rs.getString("username"),
                        rs.getString("level"),
                        rs.getTimestamp("registertime"),
                        rs.getDouble("spentmoney"),
                        rs.getString("phone"),
                        rs.getString("email")
                });
            }
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(this, "数据库操作失败！");
        } finally {
            try {
                if (rs != null) rs.close();
                if (ps != null) ps.close();
                if (connection != null) connection.close();  // 关闭数据库连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    // 刷新表格显示所有联系人的方法
    private void refreshTable() {
        Connection connection = null;
        try {
            connection = DBUtil.getConnection();  // 获取数据库连接
            String sql = "SELECT * FROM customers";  // 构建查询所有客户的SQL语句
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
                ResultSet resultSet = preparedStatement.executeQuery();  // 执行查询操作
                updateTable(resultSet);  // 更新表格显示
            }
        } catch (SQLException e) {
            e.printStackTrace();  // 打印异常信息
        } finally {
            DBUtil.closeConnection(connection);  // 关闭数据库连接
        }
    }

    // 更新表格内容
    private void updateTable(ResultSet resultSet) throws SQLException {
        DefaultTableModel tableModel = (DefaultTableModel) contactsTable.getModel();  // 获取表格模型
        tableModel.setRowCount(0); // 清空表格

        while (resultSet.next()) {
            Object[] rowData = {
                    resultSet.getInt("id"),  // 获取ID列的值
                    resultSet.getString("username"),  // 获取姓名列的值
                    resultSet.getString("level"),  // 获取用户级别列的值
                    resultSet.getString("registertime"),  // 获取注册时间列的值
                    resultSet.getDouble("spentmoney"),//获取用户消费总金额列的值
                    resultSet.getString("phone"),//获取用户电话列的值
                    resultSet.getString("email"),  // 获取电子邮件列的值
            };
            tableModel.addRow(rowData);  // 向表格模型添加一行数据
        }
    }

}